﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CapaDeNegocio;
using CapaDeDominio;

namespace Studio7iMVC2.Controllers
{
    public class ReservaController : Controller
    {
        #region Dependencias a inyectarse con Spring.NET
        IAdministracionService AdminService = null;
        #endregion

        public ActionResult Index()
        {
            ICollection<Reserva> modelo = AdminService.ConsultaReserva(new DateTime(1900,1,1), null);                
            TempData["salas"] = ListadoSalas();
            TempData["clientes"] = ListadoClientes();
            
            return View(modelo);
        }

        public ActionResult Create() 
        {
            TempData["salas"] = ListadoSalas();
            TempData["clientes"] = ListadoClientes();
            return View();
        }

        public ActionResult ViewInstrumento(int codigo)
        {
            List<Reserva> lstRes = new List<Reserva>();            
            lstRes.Add(AdminService.ObtenerReserva(codigo));
            return View(lstRes.ToList());
        }

        public ActionResult ViewServicio(int codigo)
        {
            List<Reserva> lstRes = new List<Reserva>();
            lstRes.Add(AdminService.ObtenerReserva(codigo));
            return View(lstRes.ToList());
        }

        public ActionResult AsignarInstrumento(int codigo)
        {
            TempData["codReserva"] = codigo;
            TempData["instrumentos"] = ListadoInstrumentos();
            return View();
        }

        public ActionResult AsignarServicio(int codigo)
        {
            TempData["codReserva"] = codigo;
            TempData["servicios"] = ListadoServicios();
            return View();
        }

        [HttpPost]
        public ActionResult Instrumento(FormCollection formulario) // Recibe el formulario de Creacion.aspx
        {
                
                int codigo = Convert.ToInt32(formulario["InstrumentoCodigo"]);
                int codigoRes = Convert.ToInt32(formulario["ReservaCodigo"]);
            
                Instrumento codigoInst = AdminService.ObtenerInstrumento(Convert.ToInt32(formulario["InstrumentoCodigo"]));
                Reserva res = AdminService.ObtenerReserva(codigoRes);
                ICollection<Instrumento> lstInstrAct=res.InstrumentosAdicionales;
                List<Instrumento> lstInstrumento=new List<Instrumento>();
                if(lstInstrAct!=null)
                    lstInstrumento=lstInstrAct.ToList();

                lstInstrumento.Add(codigoInst);
                AdminService.AsignarInstrumentosAdicionalReserva(codigoRes, lstInstrumento);

                ICollection<Reserva> modelo = AdminService.ConsultaReserva(new DateTime(1900, 1, 1), null);
                TempData["salas"] = ListadoSalas();
                TempData["clientes"] = ListadoClientes();
                return View("Index", modelo);
        }

        [HttpPost]
        public ActionResult Servicio(FormCollection formulario) // Recibe el formulario de Creacion.aspx
        {

            int codigo = Convert.ToInt32(formulario["ServicioCodigo"]);
            int codigoRes = Convert.ToInt32(formulario["ReservaCodigo"]);
            Servicio codigoServ = AdminService.ObtenerServicio(Convert.ToInt32(formulario["ServicioCodigo"]));
            Reserva res = AdminService.ObtenerReserva(codigoRes);
            ICollection<Servicio> lstServAct = res.ServiciosAdicionales;
            List<Servicio> lstServicio = new List<Servicio>();
            if (lstServAct != null)
                lstServicio = lstServAct.ToList();

            /*bool repetido = false;
            foreach (Servicio se in lstServicio) {
                if (se == codigoServ) {
                    repetido = true;
                    break;
                }
            }*/

            lstServicio.Add(codigoServ);
            AdminService.AsignarServiciosAdicionalReserva(codigoRes, lstServicio);

            ICollection<Reserva> modelo = AdminService.ConsultaReserva(new DateTime(1900, 1, 1), null);
            TempData["salas"] = ListadoSalas();
            TempData["clientes"] = ListadoClientes();
            return View("Index", modelo);
        }

        [HttpPost]
        public ActionResult Crear(FormCollection formulario) // Recibe el formulario de Creacion.aspx
        {
            // Capturamos los datos del formulario enviado desde Creacion.aspx
            Reserva ReservaACrear = null;
            try
            {
                ReservaACrear = new Reserva()
                {
                    Codigo = Convert.ToInt32(formulario["Codigo"]),
                    Fecha_inicio = Convert.ToDateTime(formulario["Fecha_inicio"]),
                    Hora_inicio = Convert.ToInt32(formulario["Hora_inicio"]),
                    Tiempo = Convert.ToInt32(formulario["Tiempo"]),
                    Estado = "1",
                    Sala = AdminService.ObtenerSala(Convert.ToInt32(formulario["SalaCodigo"])),
                    Cliente = AdminService.ObtenerCliente(int.Parse(formulario["ClienteCodigo"]))
                };            
            
                // Coordinamos con el negocio para la funcionalidad           
                Reserva reservaCreada = AdminService.RegistrarReserva(ReservaACrear);
                TempData["mensaje"] = "Reserva " + reservaCreada.Codigo + " creada exitosamente";
                return RedirectToAction("Index"); // Todo bien, a la lista
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty, ex.Message); // Agregamos el error a mostrarse
                return View("Create", ReservaACrear); // Problemas! De nuevo a Creacion.aspx
            }
        }

        [HttpPost]
        public ActionResult Buscar(FormCollection formulario)
        {
            TempData["salas"] = ListadoSalas();

            DateTime fecha = new DateTime(1900, 1, 1);
            DateTime.TryParse(formulario["Fecha"], out fecha);
            Sala sala = ((formulario["SalaCodigo"] != "" ? AdminService.ObtenerSala(Convert.ToInt32(formulario["SalaCodigo"])) : null));

            ICollection<Reserva> modelo = AdminService.ConsultaReserva(fecha, sala);
            return View("Index", modelo);
        }

        private ICollection<SelectListItem> ListadoSalas()
        {
            ICollection<SelectListItem> salas = new List<SelectListItem>();
            salas.Add(new SelectListItem() { Value = string.Empty, Text = "Seleccione.." });
            foreach (Sala sala in AdminService.ListarSalas("", null, null, ""))
                salas.Add(new SelectListItem()
                {
                    Value = sala.Codigo.ToString(),
                    Text = sala.Nombre
                });
            return salas;
        }

        private ICollection<SelectListItem> ListadoClientes()
        {
            ICollection<SelectListItem> clientes = new List<SelectListItem>();
            clientes.Add(new SelectListItem() { Value = string.Empty, Text = "Seleccione.." });
            foreach (Cliente cliente in AdminService.ListarClientes())
                clientes.Add(new SelectListItem()
                {
                    Value = cliente.Codigo.ToString(),
                    Text = cliente.Nombres + " " + cliente.Apellidos
                });
            return clientes;
        }

        private ICollection<SelectListItem> ListadoServicios()
        {
            ICollection<SelectListItem> servicios = new List<SelectListItem>();
            servicios.Add(new SelectListItem() { Value = string.Empty, Text = "Seleccione.." });
            foreach (Servicio servicio in AdminService.ListarServicios())
                servicios.Add(new SelectListItem()
                {
                    Value = servicio.Codigo.ToString(),
                    Text = servicio.Nombre
                });
            return servicios;
        }

        private ICollection<SelectListItem> ListadoInstrumentos()
        {
            ICollection<SelectListItem> instrumentos = new List<SelectListItem>();
            instrumentos.Add(new SelectListItem() { Value = string.Empty, Text = "Seleccione.." });
            foreach (Instrumento instrumento in AdminService.ListarInstrumentos())
                instrumentos.Add(new SelectListItem()
                {
                    Value = instrumento.Codigo.ToString(),
                    Text = instrumento.Marca + " - " + instrumento.Modelo 
                });
            return instrumentos;
        }
    }
}
